热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【区块链|Polygon】Polygon区块链PHP开发包使用PHP语言开发Polygon

PolygonPHP开发包适用于为PHP应用快速增加对Polygon区块链数字资产的支持能力,即支持使用自有Polygon区块链节点的应用场景,也支持基于Polygon区块链官方节

Polygon PHP开发包适用于为PHP应用快速增加对Polygon区块链数字资产的支持能力, 即支持使用自有Polygon区块链节点的应用场景,也支持基于Polygon区块链官方节点API服务的 轻量级部署场景。官方下载地址:Polygon PHP开发包。

1、开发包概述

Polygon PHP开发包主要包含以下特性:

  • 支持Polygon区块链原生PHP转账交易及余额查询
  • 支持Polygon链上智能合约的部署与交互,支持ERC20/ERC721/ERC1155转账交易及到账跟踪
  • 支持Polygon链上交易的离线签名,避免泄露私钥
  • 支持使用自有节点或第三方节点,例如Polygon官方提供的公共节点

Polygon PHP软件包运行在 Php 7.1+ 环境下,当前版本1.0.0,主要类/接口及关系如下图所示:

Polygon PHP开发包的主要代码文件清单如下:

代码文件 说明
polygon.php/src/Kit.php Polygon PHP开发包入口类
polygon.php/src/Erc20.php ERC20智能合约封装类
polygon.php/src/Erc721.php ERC721智能合约封装类
polygon.php/src/Erc1155.php ERC1155智能合约封装类
polygon.php/src/SmartContract.php Polygon智能合约封装类
polygon.php/src/Credential.php Polygon区链上身份标识类,用于交易签名
polygon.php/src/NodeClient.php Polygon节点协议封装类
polygon.php/src/Callback.php Php回调辅助类
polygon.php/src/Helper.php 杂项辅助函数集
contracts/WizToken.sol 示例ERC20合约
contracts/WizNFT.sol 示例ERC721合约
contracts/WizMT.sol 示例ERC1155合约
bin/build-contracts.sh 合约编译脚本工具
demo/credential-demo.php 演示如何创建新的Polygon账号或导入已有私钥
demo/matic-demo.php 演示MATIC转账及查询
demo/erc20-demo.php 演示ERC20转账及查询
demo/erc20-event-demo.php 演示ERC20到账监听
demo/erc721-demo.php 演示ERC721转账及查询
demo/erc721-event-demo.php 演示ERC721到账监听
demo/erc1155-demo.php 演示ERC1155转账及查询
demo/erc1155-event-demo.php 演示ERC1155到账监听
demo/deploy-contracts-demo.php 演示代码,智能合约的部署
vendor 第三方依赖包目录
composer.json composer配置文件

2、使用示例代码

在使用示例代码之前,请按照实际情况设置demo/config.php中的以下配置信息:

  • NETWORK:要接入的区块链网络,可选:mainNet - Polygon主链, testNet - Polygon测试链
  • ALICE_ADDR:demo程序使用的主测试账号,该账号将用于部署代币合约、执行MATIC及ERC20/ERC721/ERC1155转账交易等操作,因此 需要有一定数量的MATIC余额。
  • ALICE_SK:主测试账号对应的私钥

2.1 Polygon链上地址创建与回复

demo/credential-demo.php演示了如何使用Polygon PHP开发包创建新的Polygon链上地址,或者导入已有私钥重建账号。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php credential-demo.php

执行结果如下:

2.2 MATIC转账及余额查询

demo/matic-demo.php演示了如何使用Polygon PHP开发包实现MATIC转账和余额查询。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php matic-demo.php

执行结果如下:

2.3 Polygon智能合约部署

demo/deploy-contracts-demo.php演示了如何使用Polygon PHP开发包部署ERC20/ERC721/ERC1155智能合约。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php deploy-contracts-demo.php

执行结果如下:

2.4 ERC20转账及查询

demo/erc20-demo.php演示了如何使用Polygon PHP开发包实现ERC20转账和余额查询等操作。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc20-demo.php

执行结果如下:

2.5 ERC20到账跟踪

demo/erc20-event-demo.php演示了如何使用Polygon PHP开发包的合约事件查询功能 实现ERC20通证的到账跟踪。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc20-event-demo.php

执行结果如下:

2.6 ERC721 NFT转让及查询

demo/erc721-demo.php演示了如何使用Polygon PHP开发包实现ERC721 NFT转让和查询等操作。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc721-demo.php

执行结果如下:

2.7 ERC721 NFT到账跟踪

demo/erc721-event-demo.php演示了如何使用Polygon PHP开发包的合约事件查询功能 实现ERC721 NFT的到账跟踪。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc721-event-demo.php

执行结果如下:

2.8 ERC1155转让及查询

demo/erc1155-demo.php演示了如何使用Polygon PHP开发包实现ERC1155转让和查询等操作。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc1155-demo.php

执行结果如下:

2.8 ERC1155到账跟踪

demo/erc1155-event-demo.php演示了如何使用Polygon PHP开发包的合约事件查询功能 实现ERC1155的到账跟踪。

在终端进入演示代码目录,执行如下命令:

1 2

~$ cd ~/polygon-php/demo ~/polygon-php/demo$ php erc1155-event-demo.php

执行结果如下:

3、使用Polygon PHP开发包

Kit类是Polygon PHP开发包的入口,使用这个类可以快速实现如下功能:

  • MATIC转账与余额查询
  • ERC20代币转账、授权、余额查询等

3.1 Kit的实例化

Kit实例化需要传入NodeClient对象和Credential对象,这两个 参数分别封装了Polygon节点提供的API、以及进行交易签名的用户身份信息。

例如,下面的代码创建一个接入Polygon主链的Kit实例,并使用 指定的私钥进行交易签名:

1 2 3 4 5 6 7 8

//use polygon\Kit; //use polygon\NodeClient; //use polygon\Credential; $kit = new Kit( NodeClient::mainNet(), //接入主链 Credential::fromKey('0x87c12d....d435') //使用指定私钥 );

3.2 MATIC转账及余额查询

使用Kit对象的transfer()方法进行MATIC转账,例如发送0.1 MATIC:

1 2 3 4 5 6

//use polygon\Kit; $to = '0x90F8bf6...0e7944Ea8c9C1'; //转账目标地址 $amount = bn('100000000000000000'); //转账金额,按最小单位 $txid = $kit->transfer($to,$amount); //提交MATIC转账交易 echo 'txid => ' . $txid . PHP_EOL; //显示交易ID

注意:需要将金额转换为最小单位,由于MATIC的小数位数是18, 因此 0.1 MATIC = 100000000000000000 最小单位。

使用balanceOf()方法查询指定地址的MATIC余额,例如:

1 2 3

$addr = '0x90F8bf6...0e7944Ea8c9C1'; //要查询的Polygon链上地址 $balance = $kit->balanceOf($addr); //查询MATIC余额,按最小单位 echo 'balance => ' . $balance . PHP_EOL; //显示MATIC余额

3.3 ERC20转账

使用Kit对象的erc20()方法获取指定ERC20合约实例,然后调用合约 的transfer()方法进行ERC20转账。例如,下面的代码 指定地址间转账123.4567 USDT(合约地址:0xc2132D05D31c914a87C6611C10748AEb04B58e8F):

1 2 3 4 5 6 7 8

//use polygon\Kit; $to = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //转账目标地址 $amount = bn('123456700'); //转账ERC20数量 $cOntractAddr= '0xc2132D05D31c914a87C6611C10748AEb04B58e8F' //USDT合约的部署地址 $txid = $kit->erc20($contractAddr) ->transfer($to,$amount); //转账ERC20 echo 'txid => ' . $txid . PHP_EOL; //显示转账交易ID

3.4 ERC20余额查询

使用erc20()方法获取指定的ERC20合约实例,然后调用合约 的balanceOf()方法查询ERC20余额。例如,下面的代码查询指定地址 的USDT余额:

1 2 3 4 5 6

//use polygon\Kit; $cOntractAddr= '0xc2132D05D31c914a87C6611C10748AEb04B58e8F' //USDT合约的部署地址 $balance = $kit->erc20($contractAddr) ->balanceOf('0x90F8bf6...0e7944Ea8c9C1'); //查询地址0x90F8...的USDT余额 echo 'balance => ' . $balance . PHP_EOL; //显示余额

3.5 ERC20到账跟踪

使用erc20()方法获取指定ERC20合约实例,然后调用 合约实例的getTransferEvents()方法查询指定条件的转账事件。

可以使用getTransferEvents()方法跟踪指定地址的到账状态。 例如查询地址0x90F8…在最近1000个区块的USDT代币到账事件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

//use polygon\Kit; $height = $kit->getBlockHeight(); $cOntractAddr= '0xc2132D05D31c914a87C6611C10748AEb04B58e8F' //USDT合约的部署地址 $events = $kit->erc20($contractAddr) ->getTransferEvents( //查询到账事件 [], //转出账号,空数组表示不要求特定的转出账号 ['0x90F8bf6...0e7944Ea8c9C1'], //接收账号,仅查询地址0x90F8...的到账事件 $height-1000, //查询起始区块号 $height //查询结束区块号 ); foreach($events as $event){ echo 'block => ' . $event->blockNumber . PHP_EOL; //事件发生区块号 echo 'from => ' . $event->params['from'] . PHP_EOL; //转出账号 echo 'to => ' . $event->params['to'] . PHP_EOL; //转入账号 echo 'value => ' . $event->params['value'] . PHP_EOL; //转账金额 }

getTransferEvents()方法返回的结果是一个事件对象数组,每个成员对象的主要字段 说明如下:

  • blockHash:事件触发的区块哈希
  • blockNumber:事件触发的区块号
  • transactionHash:触发事件的交易ID
  • address:事件触发的合约地址
  • name:事件名称,例如转账事件的名称为:Transfer
  • params:事件参数数组,例如转账事件包含以下三个参数:
    • from:转出账号
    • to:转入账号
    • value:转账数量

3.6 ERC721 NFT转让

使用Kit对象的erc721()方法获取指定ERC721合约实例,然后调用合约 的transferFrom()方法进行ERC721 NFT转账。例如,下面的代码 指定地址间转让编号为1278的ERC721 NFT(合约地址:0xc2132D05D31c914a87C6611C10748AEb04B58e8F):

1 2 3 4 5 6 7 8

//use polygon\Kit; $to = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //目标地址 $tokenId = 1278; //转让的NFT编号 $cOntractAddr= '0xcc739b569624f82f9d7a4f614e47133f37482fed'; //ERC721合约的部署地址 $txid = $kit->erc721($contractAddr) ->transfer($to,$tokenId); //转让指定的ERC721 NFT echo 'txid => ' . $txid . PHP_EOL; //显示交易ID

3.7 ERC721 NFT查询

使用Kit对象的erc721()方法获取指定的ERC721合约实例后,可以调用合约的方法查询NFT的 基本信息以及特定编号的NFT的持有人信息等。例如:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

//use Polygon\Kit; $cOntractAddr= '0xcc739b569624f82f9d7a4f614e47133f37482fed'; //ERC721合约的部署地址 $nft = $kit->erc721($contractAddr); //返回ERC721合约实例 echo 'name => ' . $nft->name() . PHP_EOL; echo 'symbol => ' . $nft->symbol() . PHP_EOL; echo 'total supply =>' . $nft->totalSupply() . PHP_EOL; $tokenId = 1278; //NFT编号 echo 'owner => ' . $nft->ownerOf($tokenId); //返回指定NFT的持有人 echo 'token uri => ' . $nft->tokenURI($tokenId) . PHP_EOL; //返回指定NFT的元信息URI $user = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //用户地址 echo 'total nfts => ' . $nft->balanceOf($user) . PHP_EOL; //用户持有的NFT总数

3.8 ERC721 NFT到账跟踪

使用erc721()方法获取指定ERC721合约实例,然后调用 合约实例的getTransferEvents()方法查询指定条件的转账事件。

可以使用getTransferEvents()方法跟踪指定地址的到账状态。 例如查询地址0x90F8…在最近1000个区块的指定NFT合约到账事件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

//use polygon\Kit; $height = $kit->getBlockHeight(); $cOntractAddr= '0xcc739b569624f82f9d7a4f614e47133f37482fed'; //ERC721合约的部署地址 $events = $kit->erc721($contractAddr) ->getTransferEvents( //查询到账事件 [], //转出账号,空数组表示不要求特定的转出账号 ['0x90F8bf6...0e7944Ea8c9C1'], //接收账号,仅查询地址0x90F8...的到账事件 $height-1000, //查询起始区块号 $height //查询结束区块号 ); foreach($events as $event){ echo 'block => ' . $event->blockNumber . PHP_EOL; //事件发生区块号 echo 'from => ' . $event->params['from'] . PHP_EOL; //转出账号 echo 'to => ' . $event->params['to'] . PHP_EOL; //转入账号 echo 'tokenId => ' . $event->params['tokenId'] . PHP_EOL; //转让的NFT编号 }

3.9 ERC1155转帐

使用Kit对象的erc1155()方法获取指定ERC1155合约实例,然后调用合约 的safeTransferFrom()方法进行ERC1155转账。例如,下面的代码 指定地址间转帐编号为1的ERC1155 NFT(合约地址:0xafefbbab1038a4fd475d685c11b07bd697e20e38):

1 2 3 4 5 6 7 8 9 10

//use polygon\Kit; $from = $kit->getSender(); //转出地址 $to = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //目标地址 $tokenId = 1; //转让的通证编号 $value = 1000000; //转让数量 $cOntractAddr= '0xafefbbab1038a4fd475d685c11b07bd697e20e38'; //ERC1155合约的部署地址 $txid = $kit->erc1155($contractAddr) ->safeTransferFrom($from, $to,$tokenId, $value); //转让指定的ERC1155通证 echo 'txid => ' . $txid . PHP_EOL; //显示交易ID

3.10 ERC1155查询

使用Kit对象的erc1155()方法获取指定ERC1155合约实例后,可以调用合约的balanceOf()方法 查询用户持有的ERC1155通证数量。例如:

1 2 3 4 5 6 7 8

//use Polygon\Kit; $cOntractAddr= '0xafefbbab1038a4fd475d685c11b07bd697e20e38'; //ERC1155合约的部署地址 $mt = $kit->erc1155($contractAddr); //返回合约实例 $user = '0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1'; //用户地址 $tokenId = 1; //通证编号 echo 'banalce => ' . $mt->balanceOf($user, $tokenId); //用户持有的指定编号通证的数量

3.11 ERC1155到账跟踪

使用Kit对象的erc1155()方法获取指定的ERC1155合约实例,然后调用 合约实例的getTransferEvents()方法查询指定条件的转账事件。

可以使用getTransferEvents()方法跟踪指定地址的到账状态。 例如查询地址0x90F8…在最近1000个区块的指定ERC1155通证到账事件:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

//use polygon\Kit; $height = $kit->getBlockHeight(); $cOntractAddr= '0xafefbbab1038a4fd475d685c11b07bd697e20e38'; //ERC1155合约的部署地址 $events = $kit->erc1155($contractAddr) ->getTransferEvents( //查询到账事件 [], //转出账号,空数组表示不要求特定的转出账号 ['0x90F8bf6...0e7944Ea8c9C1'], //接收账号,仅查询地址0x90F8...的到账事件 $height-1000, //查询起始区块号 $height //查询结束区块号 ); foreach($events as $event){ echo 'block => ' . $event->blockNumber . PHP_EOL; //事件发生区块号 echo 'from => ' . $event->params['from'] . PHP_EOL; //转出账号 echo 'to => ' . $event->params['to'] . PHP_EOL; //转入账号 echo 'id => ' . $event->params['id'] . PHP_EOL; //转让的通证编号 echo 'value => ' . $event->params['value'] . PHP_EOL; //转让的通证数量 }

4、Polygon区块链身份与地址表示

在Polygon PHP开发包中,使用Credential对象表征区块链上的一个用户身份,使用普通的 字符串表征区块链上的一个地址,这两者的区别在于Credential包含了用户 的私钥信息,可以用来签名交易,因此需要保护。

使用Credential类的静态方法create()创建新账户。例如,下面的代码创建一个 新的账户并显示其私钥、公钥和地址:

1 2 3 4 5 6

//use polygon\Credential; $credential = Credential::create(); //创建新账号 echo 'private key => ' . $credential->getPrivateKey() . PHP_EOL; //显示私钥 echo 'public key => ' . $credential->getPublicKey() . PHP_EOL; //显示公钥 echo 'address => ' . $credential->getAddress() . PHP_EOL; //显示地址

可以使用静态方法fromKey()导入已有的私钥来实例化Credential。 例如下面的代码导入已有私钥并显示地址:

1 2 3 4

//use polygon\Credential; $credential = Credential::fromKey('0x7889...023a'); //导入已有私钥 echo 'address => ' . $credential->getAddress() . PHP_EOL; //显示相应地址

5、使用NodeClient

NodeClient类封装了Polygon节点的RPC访问协议。实例化NodeClient时,需要指定要连接 的节点URL,例如使用本地的全节点:

1 2 3

//use polygon\NodeClient; $client = new NodeClient('http://localhost:8545');

当使用Polygon官方节点时,NodeClient类也提供列两个静态函数mainNet()testNet(),分别 用于接入官方提供的主链节点和测试链节点。

例如,下面的代码是等效的:

1 2 3 4 5 6 7

//use polygon\NodeClient; $client = new NodeClient('https://rpc-mainnet.maticvigil.com'); $tc = NodeClient::mainNet(); //与上面等效 $tc = new NodeClient('https://rpc-mumbai.maticvigil.com'); $tc = NodeClient::testNet(); //与上面等效


推荐阅读
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • PHP引用的概念和用法详解
    本文详细介绍了PHP中引用的概念和用法。引用是指不同的变量名访问同一个变量内容,类似于Unix文件系统中的hardlink。文章从引用的定义、作用、语法和注意事项等方面进行了解释和示例。同时还介绍了对未定义变量使用引用的情况,以及在函数和new运算符中使用引用的注意事项。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • 在C#中,使用关键字abstract来定义抽象类和抽象方法。抽象类是一种不能被实例化的类,它只提供部分实现,但可以被其他类继承并创建实例。抽象类可以用于类、方法、属性、索引器和事件。在一个类声明中使用abstract表示该类倾向于作为其他类的基类成员被标识为抽象,或者被包含在一个抽象类中,必须由其派生类实现。本文介绍了C#中抽象类和抽象方法的基础知识,并提供了一个示例代码。 ... [详细]
author-avatar
杭州琦琦妈_120
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有